(no subtitles, sorry)
Warum WWW::Mechanize::PhantomJS?
Was ist WWW::Mechanize::PhantomJS?
Anwendungen
Max Maischein
DZ BANK Frankfurt
Deutsche Zentralgenossenschaftsbank
Integrationsmanagement TxB
Wenn ich es tun kann
... kann der Computer es wiederholen
... jedesmal korrekt
Perl (na klar)
Host-Automation (3270, Win32::OLE)
WWW::Mechanize
WWW::Mechanize::Shell (GPW 2002)
WWW::Mechanize::Firefox (2010)
... und jetzt WWW::Mechanize::PhantomJS
Web Anwendungen immer noch im Vormarsch
Anwendungen halten Zustand im Client
... verwenden viel Javascript
Javascript ist nicht Perls Stärke
Javascript::SpiderMonkey von Mike Schili, Thomas Busch auf CPAN
Nur Javascript, kein DOM
Javascript::Engine von Father Chrysostomos/SPROUT auf CPAN
Pure Perl, laaangsaam
Bekannte Anwendung
Kompatible Anwendung
Interaktive Anwendung
WWW::Mechanize::Firefox
WWW::Mechanize::Firefox möchte ein Fenster
WWW::Mechanize::Firefox verwendet meinen Browser
WWW::Mechanize::Firefox möchte ein Fenster
WWW::Mechanize::Firefox verwendet meinen Browser
PhantomJS ist Firefox, nur ohne UI
WWW::Mechanize::Firefox möchte ein Fenster
WWW::Mechanize::Firefox verwendet meinen Browser
PhantomJS ist WebKit, nur ohne UI
Mein Programm
WWW::Mechanize::PhantomJS
Selenium::Remote::Driver
ghostdriver
PhantomJS
ein erweitertes Interface
von WWW::Mechanize
mit PhantomJS als Backend
1: my $mech = WWW::Mechanize::PhantomJS->new(); 2: $mech->get('http://act.useperl.at/ye2014'); 3: $mech->content_as_png();
Normale WWW::Mechanize API
Javascript
CSS Selektoren (via HTML::Selector::XPath)
XPath Selektoren
Javascript Fehlermeldungen!
Webseiten automatisieren
Integrierte JS Unit Tests
Nutzereingaben mit Javascript auf dem Server validieren
Verrückte Sachen
PhantomJS steuern
01-open-local.pl
1: my $mech = WWW::Mechanize::PhantomJS->new(); 2: $mech->get_local('datei.html');
Webseite testen
02-dump-links.pl
1: my $mech = WWW::Mechanize::PhantomJS->new(); 2: $mech->get_local('link.html'); 3: 4: sleep 5; 5: 6: print $_->get_attribute('href'), 7: "\n\t-> ", 8: $_->get_attribute('innerHTML'), "\n" 9: for $mech->selector('a.download');
Javascript ausführen
03-javascript.pl
1: // Javascript 2: 3: 4: 5: " ".join(["Just","another","Perl","Hacker"]);
Execute Javascript
03-javascript.pl
1: # Perl 2: 3: 4: print $mech->eval_in_page(<<'JS'); 5: " ".join(["Just","another","Perl","Hacker"]); 6: JS
Chat
Javascript+Perl
Server-Sent Events
Tests
05-screenshot-online.pl
1: my $mech = WWW::Mechanize::PhantomJS->new(); 2: my $url= 'http://mychat.dyn.datenzoo.de:5000'; 3: print "Loading $url\n"; 4: $mech->get($url); 5: 6: show_screen;
06-send-chat.pl
1: $mech->get($url); 2: 3: sleep 5; 4: # Set username 5: $mech->eval_in_page(<<'JS', $name); 6: ...
06-send-chat.pl
1: $mech->get($url); 2: 3: sleep 5; 4: # Set username 5: $mech->eval_in_page(<<'JS', $name); 6: (function(name) { 7: set_username(name); 8: })(arguments[0]); 9: JS 10: sleep 1;
06-send-chat.pl
1: # Send chat 2: $mech->eval_in_page(<<'JS', $msg); 3: (function(msg) { 4: $("#message").val( msg ); 5: post_chat( document.createEvent('UIEvent') ); 6: })(arguments[0]); 7: JS
06-send-chat.pl
1: http://www.youtube.com/v/pir_PJmOz8Q 2: 3: https://twitter.com/cpan_pevans/status/503239001101586432 4: 5: http://i.qkme.me/3pvsb6.jpg
07-screenshot-pdf.pl
1: my $mech = WWW::Mechanize::PhantomJS->new(); 2: my $url= 'http://localhost:5000'; 3: print "Loading $url\n"; 4: $mech->get($url); 5: 6: $mech->render_content( 7: format => 'pdf', 8: filename => 'screen.pdf' 9: );
PhantomJS
ghostdriver (im Modul dabei)
Patches für Ghostdriver um Selenium zu umgehen (inklusive)
WWW::Mechanize
Selenium::Driver::Remote
API Implementation (->post()
, ...)
API Erweiterung
Dokumentation
->post()
Eigene HTTP header (->agent()
, ... )
Leichte Sachen zuerst
Selenium ist nur für "User simulation"
Keine ->post()
Funktion
->post()
Funktion halb implementiert
... noch nicht gebraucht
API für
Browserfenster (open, close, popup)
Frames (schwacher Selenium support)
Downloads
Event API? Callback API?
Liste der Events seit dem letzten Aufruf
::Firefox Dokumentation
W:M::PhantomJS::Examples
W:M:PhantomJS::Troubleshooting
W:M:PhantomJS::Installation
(A)synchrones Event Modell
Asynchrone Kommunikation (AnyEvent)
Weniger Selenium
1: PhantomJS Firefox 2: 3: Display Nein Ja
1: PhantomJS Firefox 2: 3: Display Nein Ja 4: Cookies 5: persistent Optional Ja
1: PhantomJS Firefox 2: 3: Display Nein Ja 4: Cookies 5: persistent Optional Ja 6: Eigene SSL 7: Zertifikate Leicht Schwer
1: PhantomJS Firefox 2: 3: Display Nein Ja 4: Cookies 5: persistent Optional Ja 6: Eigene SSL 7: Zertifikate Leicht Schwer 8: Dialoge Möglich Schwer
1: PhantomJS Firefox 2: 3: Display Nein Ja 4: Cookies 5: persistent Optional Ja 6: Eigene SSL 7: Zertifikate Leicht Schwer 8: Dialoge Möglich Schwer 9: alert() Ja Schwer
Der Code ist auf CPAN in
WWW::Mechanize::PhantomJS::Examples
Fragen?
Fragen?
corion@cpan.org
Folien liegen unter
WWW::Mechanize::PhantomJS auf CPAN
https://github.com/corion/www-mechanize-phantomjs auf Github
The Good
Test Suite von WWW::Mechanize::Firefox
API von WWW::Mechanize
Erfahrung mit ::Firefox
32bit App, 64bit Perl -> TCP!
The Good, the Bad
Selenium ist NUR für Browser"interaktion"
Selenium mag keine Frames
Hacks für ghostdriver-API
Keine Patches upstream an ghostdriver-Entwickler
The Good, the Bad, the Ugly
Feine Unterschiede zwischen ::Firefox und ::PhantomJS
100% OK bis
1: s/::Firefox/::PhantomJS/g
Fragen?
corion@cpan.org
Folien unter
WWW::Mechanize::PhantomJS auf CPAN
https://github.com/corion/www-mechanize-phantomjs auf Github